package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraEconomicoDAO;
import mx.ipn.persistencia.dao.PersonaDAO;
import mx.ipn.to.BitacoraEconomicoTO;
import mx.ipn.to.PersonaTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraEconomicoDAOMySQL implements BitacoraEconomicoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraEconomicoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_economico (id_economico,id_persona,activo,fecha) VALUES(?,?,?,?)";

	private static final String UPDATE = "UPDATE bitacora_economico SET id_economico=?,id_persona=?,activo=?,fecha=? WHERE id_operacion=?";
	private static final String FINDBYID = "SELECT * FROM bitacora_economico WHERE id_operacion=?";
	private static final String SELECT = "SELECT * FROM bitacora_economico";
	private static final String SELECTBYRANGOFECHA = "SELECT * FROM bitacora_economico WHERE fecha>=? AND fecha<=?";
	private static final String SELECTBYPERSONA = "SELECT * FROM bitacora_economico WHERE id_persona=?";
	private static final String SELECTBYECONOMICO = "SELECT * FROM bitacora_economico WHERE id_economico=?";

	FabricaDeDAOs fabricaMySQL;

	@Override
	public BitacoraEconomicoTO findBitacoraEconomicoById(int idBitacoraEconomico) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idBitacoraEconomico);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();
			if (rs.next()) {
				int idEconomico = rs.getInt("id_economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				BitacoraEconomicoTO bitacoraEconomicoTO = new BitacoraEconomicoTO(
						idBitacoraEconomico, idEconomico, personaTO, activo, rs
								.getDate("fecha"));
				ps.close();
				conexion.close();
				return bitacoraEconomicoTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraEconomico(
			BitacoraEconomicoTO bitacoraEconomicoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);
			ps.setInt(1, bitacoraEconomicoTO.getIdEconomico());
			ps.setInt(2, bitacoraEconomicoTO.getPersonaTO().getIdPersona());
			ps.setBoolean(3, bitacoraEconomicoTO.getActivo());
			ps.setDate(4, FechaHoraTO.getFecha(bitacoraEconomicoTO.getFecha()));
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraEconomicoTO> selectBitacoraEconomico() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();

			ArrayList<BitacoraEconomicoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraEconomicoTO>();

				int idOperacion = rs.getInt("id_operacion");
				int idEconomico = rs.getInt("id_economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				BitacoraEconomicoTO bitacoraEconomicoTO = new BitacoraEconomicoTO(
						idOperacion, idEconomico, personaTO, activo, rs
								.getDate("fecha"));
				coleccion.add(bitacoraEconomicoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraEconomicoTO> selectByEconomico(int idEconomico) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYECONOMICO);
			ps.setInt(1, idEconomico);
			ResultSet rs = ps.executeQuery();

			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();

			ArrayList<BitacoraEconomicoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraEconomicoTO>();

				int idOperacion = rs.getInt("id_operacion");

				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				BitacoraEconomicoTO bitacoraEconomicoTO = new BitacoraEconomicoTO(
						idOperacion, idEconomico, personaTO, activo, rs
								.getDate("fecha"));
				coleccion.add(bitacoraEconomicoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraEconomicoTO> selectByRangoFecha(Date inicioFecha,
			Date finFecha) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHA);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();

			ArrayList<BitacoraEconomicoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraEconomicoTO>();

				int idOperacion = rs.getInt("id_operacion");
				int idEconomico = rs.getInt("id_economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				java.sql.Date fecha = rs.getDate("fecha");
				
				BitacoraEconomicoTO bitacoraEconomicoTO = new BitacoraEconomicoTO(
						idOperacion, idEconomico, personaTO, activo, fecha);
				coleccion.add(bitacoraEconomicoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraEconomicoTO selectByPersona(int idPersona) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla persona
			PersonaDAO personaDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<Integer> listIdEconomico = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<java.sql.Date> listFecha = null;

			BitacoraEconomicoTO bitacoraEconomicoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPERSONA);
			ps.setInt(1, idPersona);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdEconomico == null) {

					listIdOperacion = new ArrayList<Integer>();
					listIdEconomico = new ArrayList<Integer>();
					listActivo = new ArrayList<Boolean>();
					listFecha = new ArrayList<java.sql.Date>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					personaDAO = fabricaMySQL.getPersonaDAO();
				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listIdEconomico.add(rs.getInt("id_economico"));
				listActivo.add(rs.getBoolean("activo"));
				listFecha.add(rs.getDate("fecha"));
			}
			if (listIdEconomico != null) {
				PersonaTO personaTO = personaDAO.findPersonaById(idPersona);

				Boolean[] arrActivo = (Boolean[]) listActivo
						.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdEconomico = (Integer[]) listIdEconomico
						.toArray(new Integer[listIdEconomico.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);

				bitacoraEconomicoTO = new BitacoraEconomicoTO(arrIdOperacion,
						arrIdEconomico, personaTO, arrActivo, arrFecha);
			}
			ps.close();
			conexion.close();
			return bitacoraEconomicoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateBitacoraEconomico(BitacoraEconomicoTO bitacoraEconomicoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			ps.setInt(1, bitacoraEconomicoTO.getIdEconomico());
			ps.setInt(2, bitacoraEconomicoTO.getPersonaTO().getIdPersona());
			ps.setBoolean(3, bitacoraEconomicoTO.getActivo());
			ps.setDate(4, FechaHoraTO.getFecha(bitacoraEconomicoTO.getFecha()));
			ps.setInt(5, bitacoraEconomicoTO.getIdOperacion());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
